import Circle, { ICircle } from "../base/Circle";
import Config from "../config/Config";
import Chunk from "./Chunk";
import { RandUtil } from "../util/RandUtil";
import World from "./World";
import Timer from "../../core/Timer";
import SnakeHead from "../snake/SnakeHead";
import { Util } from "../util/Util";

const util = Util
const cfg = Config.food
const t_clearTime = "clearTime"
const ru = RandUtil

/** 食物类型 */
export enum FoodType {
    /** 普通食物 */
    normal,
    /** 战利品食物 */
    snake,
}

export interface IFood extends ICircle {
    /** 所在世界 */
    world: World,
    /** 分数 */
    score?: number,
    /** 颜色 */
    color?: string,
    /** 食物类型 */
    type?: FoodType,
}


/** 食物类 */
export default class Food extends Circle {

    /** 对象池 */
    static pool: Food[] = []

    /** 所在世界 */
    private _world: World
    /** 唯一标识 */
    private _id: number
    /** 奖励分 */
    private _score: number
    /** 食物类型 */
    private _type: FoodType
    /** 颜色 */
    private _color: string
    /** 颜色整型 */
    private _rgb: number
    /** 所在区块 */
    private _chunks: Chunk[]
    /** 计时器 */
    private _timer: Timer
    /** 是否存在 */
    private _isLive: Boolean

    /** 必须使用create创建食物 */
    private constructor(obj?: ICircle) { super(obj) }

    /** 通过对象池创建食物 */
    static create(obj: IFood) {
        let ins = Food.pool.pop() || new Food()
        ins._isLive = true
        ins.set(obj)
        ins.setScore(obj.score)
        ins._world = obj.world
        ins._id = obj.world.getNewFoodId()
        ins._type = obj.type || FoodType.normal
        if (ins._type == FoodType.snake) {
            ins._color = obj.color
            if (obj.color) {
                ins._rgb = util.color2rgb(obj.color)
            }
            ins._timer = new Timer()
            ins._timer.set(t_clearTime, ru.rand2(cfg.clearTime))
        }
        return ins
    }

    /** 回收当前节点到对象池中 */
    recover() {
        this._isLive = false
        this._timer = null
        this._world = null
        Food.pool.push(this)
    }

    /** 从世界中销毁 */
    destory() {
        this._world.removeFood(this)
        this.recover()
    }

    /** 被吃 */
    eaten(eater: SnakeHead) {
        this._world.removeFood(this, eater)
    }

    /** 更新所在的区块 */
    updateChunk() {
        if (this._chunks) {
            this._chunks.forEach(chunk => chunk.removeFood(this))
        }
        this._chunks = this._world.getChunks(this)
        this._chunks.forEach(chunk => chunk.addFood(this))
    }

    /** 设置分数 */
    setScore(score?: number) {
        this._score = score;
        if (!this._score) {
            this._score = ru.chance(ru.rand2(cfg.superFoodChance)) ?
                ru.rand2(cfg.superFoodSocre) : ru.rand2(cfg.score)
        }
        //分数决定大小
        this.w = 6.66 + Math.pow(this._score, 0.33) * 4.44;
    }

    /** 定时清除战利品食物 */
    timerDestory() {
        this._timer.check(t_clearTime, () => {
            this.destory()
        })
    }

    // ================================================================

    /** 唯一标识 */
    get id() { return this._id }

    /** 是否存在 */
    get isLive() { return this._isLive }

    /** 食物类型 */
    get type() { return this._type }

    /** 颜色 */
    get color() { return this._color }

    /** 颜色整型 */
    get rgb() { return this._rgb }

    /** 奖励分 */
    get score() { return this._score }

    /** 所在区块 */
    get chunks() { return this._chunks }
}